#include "utils/SerialCommunicator.hpp"
#include "utils/Logger.hpp"


/**
 * 构造函数：初始化串口
 * @param uart_dev 串口设备路径
 */
SerialCommunicator::SerialCommunicator(const std::string &uart_dev) {
    uart_fd = serialOpen(uart_dev.c_str(), baudRate);
    if (uart_fd == -1) LOG_ERROR("无法打开串口设备: %s", uart_dev.c_str());
}

/**
 * 析构函数：关闭串口
 */
SerialCommunicator::~SerialCommunicator() {
    if (uart_fd != -1) {
        serialClose(uart_fd);
    }
}

/**
 * 从串口读取可用数据
 *
 * @return 包含读取数据的字节向量。若读取失败或无数据，返回空向量
 * @note 函数会清空内部缓冲区并读取当前所有可用数据
 */
std::vector<uint8_t> SerialCommunicator::receiveData() {
    buffer.clear();

    int bytesAvailable = serialDataAvail(uart_fd); // 获取可用字节数
    if (bytesAvailable < 0) {
        std::cerr << "获取串口可用字节数失败: " << strerror(errno) << std::endl;
        return {};
    }

    if (bytesAvailable > 0) {
        buffer.resize(bytesAvailable); // 调整缓冲区大小并读取数据
        int bytesRead = read(uart_fd, buffer.data(), bytesAvailable);

        if (bytesRead < 0) {
            std::cerr << "串口读取失败: " << strerror(errno) << std::endl;
            buffer.clear();  // 清空缓冲区
            return {};
        }
    }
    return buffer;
}
